iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

延續上一篇文章 "該好好重構和斷捨離的是程式碼還是人生" 中可怕的例子,這篇文章我們來看看同類型的東西一再出現該怎麼辦。

在生活中擁有什麼東西,等同於自己的價值觀,有時候總是害怕未來缺少什麼,所以在生活中我們習慣提早購買備品,仔細想想大家的家裡是不是都有非常多的牙刷、牙膏、衛生紙呢?! 而實際上我們只需要一條牙膏跟一隻牙刷。

在寫程式中,時常會提醒我們把重複的地方合而為一,不過重複真的不好嗎?!

小編曾改過一個專案,起初專案就是表格元件但有多個階段畫面用到,隨著時間過去那個表格在不同的階段需要依照角色有著不同的權限控管。

假設今天總共用五個階段五個角色,每個角色在不同階段需要填的欄位並不相同,可以想像一個班級有不同的幹部,而班級學期報告需要大家按照各自的職掌在不同階段逐漸把內容完善。

在開發階段我們需要高頻率同時的測試不同階段和不同角色,在這個階段我們可以選擇

  • 把不同階段不同角色的元件拆開: 會發現同類型的東西一再出現,但好處是什麼,這個系統在分別修改拆開的元件時並不會影響整個流程與其他角色的行為,系統的可容錯性是較高的,也比較容易快速的開發和測試
  • 把不同階段不同角色的元件合在一起: 雖然減少了重複的東西,但會將傳入的參數還有元件中的邏輯變得更加複雜
// 拆開
// 初始版本只有基本角色屬性
const player1 = {
  name: "玩家1",
  level: 1,
  health: 100,
  damage: 10,
};

// 一段時間後,遊戲需要更多的角色屬性
const player2 = {
  name: "玩家2",
  level: 5,
  health: 150,
  damage: 15,
  agility: 20, // 新需求:敏捷度
  inventory: ["劍", "盾"], // 新需求:背包
};

// 合起來
function processUserData(
  name,
  level,
  health,
  damage,
  agility,
  inventory,
  statusCode
) {
  if (
    health > 10 &&
    (name === "foo" || damage < 5) &&
    (name !== "bar" || agility > 20)
  ) {
    // ...
  }
  // 非常長的函數內容...
  if (statusCode === 20100) {
    // ...
  }

  if (statusCode === 20101) {
    // ...
  }
}

在這樣的情境下,不管是拆開或是合起來都會產生些許問題,大大們怎麼看?!

剛剛的例子來說也許我會至少先分類,參數分成必要跟選填

function processUserData(
  { name, level, health, damage },
  { agility, inventory, statusCode }
) {
  if (
    health > 10 &&
    (name === "foo" || damage < 5) &&
    (name !== "bar" || agility > 20)
  ) {
    // ...
  }
  // 非常長的函數內容...
  if (statusCode === 20100) {
    // ...
  }

  if (statusCode === 20101) {
    // ...
  }
}

接著把必要、選填相關的判斷分別先抽出來且變成比較好懂的敘述

function processUserData(
  { name, level, health, damage },
  { agility, inventory, statusCode }
) {
  if (checkNameAndHealth() && checkAgility()) {
    // ...
  }
  // 非常長的函數內容...
  if (statusCode === 20100) {
    // ...
  }

  if (statusCode === 20101) {
    // ...
  }
}

重複最大的問題是同類型的東西需要修改時,會需要在很多地方修改,但如果程式很少要改,那從這個角度來看好像也沒關係嗎? 那如果是很常需要更改,是不是就容易發生忘記改到的情況?

重複的東西,是真的相同嗎? 還是只是剛好看起來很像,但滿足的需求不同?

舉個例子像我就有好多耳機跟運動鞋,學校宿舍用、工作租屋用、辦公室用、運動用、浴室用,但搬回家之後就多了許多沒用到的,如果依照場合去分類就會擁有好幾同類型的物品,整理東西的時候,我們就要先把同一類的東西先集中,這樣才會知道實際上自己擁有了多少。

有的時候的確是真的相同,牙刷、牙膏來說就是這樣。但以運動用的耳機和浴室用的藍芽喇叭就需要簡易的防水,這就是處理問的問題不太相同,但我們是真的需要嗎?

整理東西應該是依照物品來做分類和整理,而非依照場所。

整理,是在告訴自己,重要的不是過去的回憶,而是經歷過往後所被成就現在的自己


上一篇
該好好重構和斷捨離的是程式碼還是人生
下一篇
物件的管理,你想要九把刀還是瑞士刀
系列文
前端三分鐘 X 每天三分鐘的斷捨離,讓每一天都可以早點下班30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言